#处理文件
def process_date():
    
    
    global fig,fig1
    global xz_min, xz_max,yz_min, yz_max

    # 将字典里键config.dmnum对应的值定义为空列表和dataframe
    config.line_numbers[config.dmnum] = []
    config.EC1[config.dmnum] = []
    config.fix[config.dmnum] = []
    config.add[config.dmnum] = []
    config.ysdel[config.dmnum] = []
    config.POS[config.dmnum] = []
    config.FIX[config.dmnum] = []
    config.ADD[config.dmnum] = []
    config.CHA[config.dmnum] = []
    config.XH[config.dmnum] = []
    config.dfEC1[config.dmnum] = pd.DataFrame()
    config.dfFIX[config.dmnum] = pd.DataFrame()
    config.ZZFIX[config.dmnum] = pd.DataFrame()
    config.dfADD[config.dmnum] = pd.DataFrame()
    config.dfDEL[config.dmnum] = pd.DataFrame()
    config.dfCHA[config.dmnum] = pd.DataFrame()
    config.ys_ZZFIX[config.dmnum] = pd.DataFrame()

    #打印断面文件名
    print(config.notemenu[config.dmnum])
    with open(config.notemenu[config.dmnum], 'r') as note:
    #note = open(config.notemenu[config.dmnum], 'r')
        # 定义正则表达式
        date_regex = re.compile(r'\bTND.+')
        location_regex = re.compile(r'\bPTS\s.+')
        fix_regex = re.compile(r"\bFIX .+")
        ec1_regex = re.compile(r"\bEC1 1.+")
        pos_regex = re.compile(r"\bPOS .+")
        # 修改后正则表达式
        add_regex = re.compile(r"\bAdd.+")
        cha_regex = re.compile(r"\bCha.+")
        del_regex = re.compile(r"\bDel.+")
        # 遍历文件并匹配正则表达式
        for line in note:
            # 匹配日期时间
            if date_regex.search(line):
                date_fields = date_regex.search(line).group().split()
                config.line_numbers[config.dmnum].append(date_fields[2])
            # 匹配线的起止点
            if location_regex.search(line):
                location_fields = location_regex.search(line).group().split()
                config.line_numbers[config.dmnum].append(location_fields[1])
                config.line_numbers[config.dmnum].append(location_fields[2])
            # 匹配 config.FIX
            if fix_regex.findall(line):
                fix_fields = fix_regex.findall(line)[0].split(" ")
                fix_fields[2] = round(float(fix_fields[2]), 3)
                fix_fields[3] = int(fix_fields[3])
                result = [fix_fields[2], fix_fields[3]]
                config.fix[config.dmnum].append(result)
            # 匹配 config.EC1 1
            if ec1_regex.findall(line):
                ec1_fields = ec1_regex.findall(line)[0].split(" ")
                ec1_fields[2] = round(float(ec1_fields[2]), 3)
                ec1_fields[3] = '-' + ec1_fields[3]
                ec1_fields[3] = round(float(ec1_fields[3]), 2)
                result = [ec1_fields[2], ec1_fields[3]]
                config.EC1[config.dmnum].append(result)
            #匹配config.POS
            if pos_regex.findall(line):
                pos_fields = pos_regex.findall(line)[0].split(" ")
                pos_fields[2] = round(float(pos_fields[2]), 3)
                pos_fields[3] = round(float(pos_fields[3]), 3)
                pos_fields[4] = round(float(pos_fields[4]), 3)
                result = [pos_fields[2], pos_fields[3], pos_fields[4]]
                config.POS[config.dmnum].append(result)
            # 处理 Add 信息
            if add_regex.findall(line):
                add_fields = add_regex.findall(line)[0].split(" ")
                add_fields[1] = int(add_fields[1])  # 序号
                add_fields[2] = round(float(add_fields[2]), 3)  # 时间
                result = [add_fields[2], add_fields[1]]
                config.add[config.dmnum].append(result)
            # 处理 Cha 信息
            if cha_regex.findall(line):
                cha_fields = cha_regex.findall(line)[0].split(" ")
                cha_fields[1] = int(cha_fields[1])  # 序号
                cha_fields[2] = float(cha_fields[2])  # 时间
                cha_fields[3] = -float(cha_fields[3])  # 原始水深
                cha_fields[4] = -float(cha_fields[4])  # 改正水深
                result = [cha_fields[2], cha_fields[1], cha_fields[3], cha_fields[4]]
                config.CHA[config.dmnum].append(result)
            # 处理 Del 信息
            if del_regex.findall(line):
                del_fields = del_regex.findall(line)[0].split(" ")
                del_fields[1] = int(del_fields[1])  # 序号
                del_fields[2] = round(float(del_fields[2]), 3)  # 时间
                result = [del_fields[2], del_fields[1]]
                config.ysdel[config.dmnum].append(result)
    #错误警告
    if len(config.EC1[config.dmnum]) == 0 :
        tkinter.messagebox.showwarning('警告', f'{config.notemenu[config.dmnum]} config.EC1 1 数据为空!')
    if len(config.POS[config.dmnum]) == 0 :
        tkinter.messagebox.showwarning('警告', f'{config.notemenu[config.dmnum]}pos 数据为空!')
    if len(config.fix[config.dmnum]) == 0:
        tkinter.messagebox.showwarning('警告', f'{config.notemenu[config.dmnum]}config.FIX  数据为空!')
    #添加点间隔判断，如果处理点间隔，干预
    if config.scrpoint != 0:
        new_fix = []
        new_fix.append(config.fix[config.dmnum][0])
        #取原config.fix第一点坐标e1,n1
        for k in range(1,len(config.POS[config.dmnum])):
            # 如果config.fix数前没有config.POS数据，就用最近config.POS的坐标
            if config.fix[config.dmnum][0][0] <= config.POS[config.dmnum][0][0]:
                e1 = config.POS[config.dmnum][0][1]
                n1 = config.POS[config.dmnum][0][2]
            # 如果config.fix数据后没有config.POS数据，就用最近config.POS的坐标
            elif config.fix[config.dmnum][0][0] >= config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][0]:
                e1 = config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][1]
                n1 = config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][2]
            elif (config.fix[config.dmnum][0][0] >= config.POS[config.dmnum][k - 1][0]) & (config.fix[config.dmnum][0][0] <= config.POS[config.dmnum][k][0]):
                t = config.POS[config.dmnum][k][0] - config.POS[config.dmnum][k - 1][0]
                t1 = config.fix[config.dmnum][0][0] - config.POS[config.dmnum][k - 1][0]
                e1 = round((t1 / t) * (config.POS[config.dmnum][k][1] - config.POS[config.dmnum][k - 1][1]) + config.POS[config.dmnum][k - 1][1], 3)
                n1 = round((t1 / t) * (config.POS[config.dmnum][k][2] - config.POS[config.dmnum][k - 1][2]) + config.POS[config.dmnum][k - 1][2], 3)
        fxh = config.fix[config.dmnum][1][1]  # 筛选后点序号,接原第一点的序号
        for i in range(1, len(config.POS[config.dmnum])):
            if (config.scrpoint >= math.sqrt((e1 - config.POS[config.dmnum][i - 1][1]) ** 2 + (n1 - config.POS[config.dmnum][i - 1][2]) ** 2)) & (
                    math.sqrt((e1 - config.POS[config.dmnum][i][1]) ** 2 + (n1 - config.POS[config.dmnum][i][2]) ** 2) >= config.scrpoint):
                # 为了运行速度，直接两个config.POS信号中间位置为目标。
                result = [round((config.POS[config.dmnum][i - 1][0] + config.POS[config.dmnum][i - 1][0]) / 2, 3), fxh]  # 时间，序号
                fxh = fxh + 1
                new_fix.append(result)
                e1 = config.POS[config.dmnum][i][1]
                n1 = config.POS[config.dmnum][i][2]
        new_fix.append(config.fix[config.dmnum][len(config.fix[config.dmnum])-1])
        config.fix[config.dmnum] = new_fix
    # 内插得到config.fix点的水深、坐标
    for i in range(len(config.fix[config.dmnum])):
        # 处理f_z
        #如果没有config.EC1数据，将水深设为0
        if len(config.EC1[config.dmnum]) == 0:
            ft = config.fix[config.dmnum][i][0]
            fxh = int(config.fix[config.dmnum][i][1])
            fz = 0

        #如果有水深信号
        else:
            #如果config.fix数据前没有config.EC1 1数据，就用最近config.EC1 1的水深
            if config.fix[config.dmnum][i][0] <= config.EC1[config.dmnum][0][0]:
                ft = config.fix[config.dmnum][i][0]
                fxh = int(config.fix[config.dmnum][i][1])
                fz = config.EC1[config.dmnum][0][1]
            # 如果config.fix数据后没有config.EC1 1数据，就用最近config.EC1 1的水深
            elif config.fix[config.dmnum][i][0] >= config.EC1[config.dmnum][len(config.EC1[config.dmnum])-1][0]:
                ft = config.fix[config.dmnum][i][0]
                fxh = int(config.fix[config.dmnum][i][1])
                fz = config.EC1[config.dmnum][len(config.EC1[config.dmnum])-1][1]
            else:
                for j in range(1,len(config.EC1[config.dmnum])):
                    if (config.fix[config.dmnum][i][0] >= config.EC1[config.dmnum][j - 1][0]) & (config.fix[config.dmnum][i][0] <= config.EC1[config.dmnum][j][0]):
                        ft = config.fix[config.dmnum][i][0]
                        fxh = int(config.fix[config.dmnum][i][1])
                        fz = config.EC1[config.dmnum][j][1]
        #取config.POS数据里的坐标
        for k in range(1,len(config.POS[config.dmnum])):
            # 如果config.fix数前没有config.POS数据，就用最近config.POS的坐标
            if config.fix[config.dmnum][i][0] <= config.POS[config.dmnum][0][0]:
                fx = config.POS[config.dmnum][0][1]
                fy = config.POS[config.dmnum][0][2]
            # 如果config.fix数据后没有config.POS数据，就用最近config.POS的坐标
            elif config.fix[config.dmnum][i][0] >= config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][0]:
                fx = config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][1]
                fy = config.POS[config.dmnum][len(config.POS[config.dmnum]) - 1][2]
            else:
                if (config.fix[config.dmnum][i][0] >= config.POS[config.dmnum][k - 1][0]) & (config.fix[config.dmnum][i][0] <= config.POS[config.dmnum][k][0]):
                    t = config.POS[config.dmnum][k][0] - config.POS[config.dmnum][k - 1][0]
                    t1 = config.fix[config.dmnum][i][0] - config.POS[config.dmnum][k - 1][0]
                    fx = round((t1 / t) * (config.POS[config.dmnum][k][1] - config.POS[config.dmnum][k - 1][1]) + config.POS[config.dmnum][k - 1][1], 3)
                    fy = round((t1 / t) * (config.POS[config.dmnum][k][2] - config.POS[config.dmnum][k - 1][2]) + config.POS[config.dmnum][k - 1][2], 3)

        result = [ft, fxh, fx, fy, fz]  # 时间、序号、X(E)、Y(N)、Z(水深)
        config.FIX[config.dmnum].append(result)
    #设置加点数据的点号
    if len(config.add[config.dmnum]) == 0:
        config.XH[config.dmnum] =  config.fix[config.dmnum][len(config.fix[config.dmnum]) - 1][1]
    else:
        config.XH[config.dmnum] = config.add[config.dmnum][len(config.add[config.dmnum])-1][1]

    # 列表转dataframe,方便绘图和处理
    config.dfFIX[config.dmnum] = pd.DataFrame(config.FIX[config.dmnum])
    config.dfFIX[config.dmnum].columns = ['时间', '序号', 'E', 'N', '水深']
    if len(config.EC1[config.dmnum]) > 0:
        config.dfEC1[config.dmnum] = pd.DataFrame(config.EC1[config.dmnum])
        config.dfEC1[config.dmnum].columns = ['时间', '水深']
    config.ZZFIX[config.dmnum] = config.dfFIX[config.dmnum]  # 保留config.dfFIX,后面用config.ZZFIX绘图
    config.ys_ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum]
    # print(config.ZZFIX[0])
    # 是否显示原图
    if config.ytfx[config.dmnum] == 0:
        # 根据config.add得到config.ADD、config.dfADD,并改变config.ZZFIX
        if len(config.add[config.dmnum]) != 0:
            for i in range(len(config.add[config.dmnum])):
                if config.add[config.dmnum][i][0] < config.EC1[config.dmnum][0][0]:
                    continue
                if config.add[config.dmnum][i][0] > config.EC1[config.dmnum][len(config.EC1[config.dmnum]) - 1][0]:
                    continue
                # 处理f_z
                for j in range(len(config.EC1[config.dmnum])):
                    if (config.add[config.dmnum][i][0] >= config.EC1[config.dmnum][j - 1][0]) & (config.add[config.dmnum][i][0] <= config.EC1[config.dmnum][j][0]):
                        ft = config.add[config.dmnum][i][0]
                        fxh = int(config.add[config.dmnum][i][1])
                        fz = config.EC1[config.dmnum][j][1]
                for k in range(len(config.POS[config.dmnum])):
                    if (config.add[config.dmnum][i][0] >= config.POS[config.dmnum][k - 1][0]) & (config.add[config.dmnum][i][0] <= config.POS[config.dmnum][k][0]):
                        T = config.POS[config.dmnum][k][0] - config.POS[config.dmnum][k - 1][0]
                        T1 = config.add[config.dmnum][i][0] - config.POS[config.dmnum][k - 1][0]
                        fx = round((T1 / T) * (config.POS[config.dmnum][k][1] - config.POS[config.dmnum][k - 1][1]) + config.POS[config.dmnum][k - 1][1], 3)
                        fy = round((T1 / T) * (config.POS[config.dmnum][k][2] - config.POS[config.dmnum][k - 1][2]) + config.POS[config.dmnum][k - 1][2], 3)
                result = [ft, fxh, fx, fy, fz]  # 时间、序号、Y(E),X(N)，Z(水深)
                config.ADD[config.dmnum].append(result)
                # config.ADD列表转dataframe,方便绘图和处理
                config.dfADD[config.dmnum] = pd.DataFrame(config.ADD[config.dmnum])
                config.dfADD[config.dmnum].columns = ['时间', '序号', 'E', 'N', '水深']
        if config.dfADD[config.dmnum].empty is False:
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].append(config.dfADD[config.dmnum])
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].sort_values(by=['时间'])  # 需要降序就加上ascending=False
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].reset_index(drop=True)  # 重新排序
            # config.dfADD[config.dmnum] = config.dfADD[config.dmnum].reset_index(drop=True)  # 重新排序
        #根据config.CHA改变config.ZZFIX、dffix、config.dfADD
        if len(config.CHA[config.dmnum]) != 0:
            config.dfCHA[config.dmnum] = pd.DataFrame(config.CHA[config.dmnum])
            config.dfCHA[config.dmnum].columns = ['时间', '序号', '原始水深', '改正水深']
            for i in range(len(config.CHA[config.dmnum])):
                # 在config.ZZFIX里改动选中的行
                config.ZZFIX[config.dmnum]['水深'][config.ZZFIX[config.dmnum]['时间'] == config.CHA[config.dmnum][i][0]] = config.CHA[config.dmnum][i][3]
                config.dfFIX[config.dmnum]['水深'][config.dfFIX[config.dmnum]['时间'] == config.CHA[config.dmnum][i][0]] = config.CHA[config.dmnum][i][3]
                config.dfADD[config.dmnum]['水深'][config.dfADD[config.dmnum]['时间'] == config.CHA[config.dmnum][i][0]] = config.CHA[config.dmnum][i][3]
        # 根据config.ysdel得到config.dfDEL
        if len(config.ysdel[config.dmnum]) != 0:
            for i in range(len(config.ysdel[config.dmnum])):
                if config.dfDEL[config.dmnum].empty:
                    config.dfDEL[config.dmnum] = config.ZZFIX[config.dmnum][config.ZZFIX[config.dmnum]['时间'] == config.ysdel[config.dmnum][i][0]]
                else:
                    config.dfDEL[config.dmnum] = config.dfDEL[config.dmnum].append(config.ZZFIX[config.dmnum][config.ZZFIX[config.dmnum]['时间'] == config.ysdel[config.dmnum][i][0]])
        #根据dfdel改动其他数据
        if config.dfDEL[config.dmnum].empty is False:
            # 在config.ZZFIX、config.dfFIX里删除del选中的行
            #print('之前config.ZZFIX', config.ZZFIX)
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].append(config.dfDEL[config.dmnum])       #两次append是为了稍后把dfdel里全部删掉
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].append(config.dfDEL[config.dmnum])
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].drop_duplicates(keep=False)     #删除重复行
            config.ZZFIX[config.dmnum] = config.ZZFIX[config.dmnum].reset_index(drop=True)  # 重新排序
            #print('之后config.ZZFIX', config.ZZFIX)
            config.dfFIX[config.dmnum] = config.dfFIX[config.dmnum].append(config.dfDEL[config.dmnum])
            config.dfFIX[config.dmnum] = config.dfFIX[config.dmnum].append(config.dfDEL[config.dmnum])
            config.dfFIX[config.dmnum] = config.dfFIX[config.dmnum].drop_duplicates(keep=False)
            config.dfFIX[config.dmnum] = config.dfFIX[config.dmnum].reset_index(drop=True)  # 重新排序
            # 在config.dfADD里删除del选中的行
            if config.dfADD[config.dmnum].empty is False:
                #print('之前config.dfADD', config.dfADD)
                config.dfADD[config.dmnum] = config.dfADD[config.dmnum].append(config.dfDEL[config.dmnum])
                #print('加一次fADD', config.dfADD)
                config.dfADD[config.dmnum] = config.dfADD[config.dmnum].append(config.dfDEL[config.dmnum])
                #print('加两次fADD', config.dfADD)
                config.dfADD[config.dmnum] = config.dfADD[config.dmnum].drop_duplicates(keep=False)  # 删除重复行
                config.dfADD[config.dmnum] = config.dfADD[config.dmnum].reset_index(drop=True)  # 重新排序
                #print('之后config.dfADD', config.dfADD)
                #config.ADD里删除config.ysdel里有的数据
                #存储删除的config.ADD的索引
                temp = []
                for i in range(len(config.ADD[config.dmnum])):
                    for j in range(len(config.ysdel[config.dmnum])):
                        if config.ADD[config.dmnum][i][0] == config.ysdel[config.dmnum][j][0]:
                            temp.append(i)
                if temp != []:
                    t1 = 0
                    for i in temp:
                        t = i - t1
                        config.ADD[config.dmnum].pop(t)
                        t1 += 1
            config.dfDEL[config.dmnum] = config.dfDEL[config.dmnum].drop(index=config.dfDEL[config.dmnum].index)   #清空dfdel,防止改变间隔后出现错误。
